package com.house.controller;

import cn.dev33.satoken.stp.StpUtil;
import com.house.entity.Result;
import com.house.entity.User;
import com.house.service.UserService;
import com.house.utils.Md5Util;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

@RestController
@RequestMapping("/user")
@Validated
public class UserController {
    @Autowired
    private UserService userService;

    @PostMapping("/register")
    public Result register(@RequestBody @Valid Map<String, String> params) {
        String username = params.get("username");
        String password = params.get("password");
        String role = params.get("role");

        // 校验角色是否合法，只允许 房东 和 租客
        if (!"LANDLORD".equalsIgnoreCase(role) && !"TENANT".equalsIgnoreCase(role)) {
            return Result.error("角色选择不合法，请选择 'LANDLORD' 或 'TENANT'");
        }

        //查询用户
        User u = userService.findByUserName(username);
        if (u == null) {
            //没有占用
            //注册
            userService.register(username,password,role.toUpperCase());
            return Result.success();
        }else{
            return Result.error("用户名已被占用");
        }

    }

    @PostMapping("/login")
    public Result<String> login(@RequestBody @Valid User user) {
        // 接收参数
        String username = user.getUsername();
        String password = user.getPassword();

        //根据用户名查询用户
        User loginUser = userService.findByUserName(username);
        //判断该用户是否存在
        if(loginUser == null){
            return Result.error("用户名错误");
        }

        //判断密码是否正确，  loginUser对象中的password是密文
        if(Md5Util.getMD5String(password).equals(loginUser.getPassword())){
            //登录成功

            //Sa-Token 登录并存储用户角色信息
            StpUtil.login(loginUser.getId());

            //存储用户名和角色到Sa-token Session
            StpUtil.getSession().set("role", loginUser.getRole());
            StpUtil.getSession().set("username", username);
            //返回Sa-Token生成的Token
            String token = StpUtil.getTokenValue();
            return Result.success(token);
        }else{
            return Result.error("密码错误");
        }
    }



    @GetMapping("/userInfo")
    public Result<User> userInfo() {
        // 从 Sa-Token 的 Session 中获取用户名
        String username = (String) StpUtil.getSession().get("username");

        // 根据用户名获取用户信息
        User user = userService.findByUserName(username);
        return Result.success(user);
    }



    @PutMapping("/update")
    public Result update(@RequestBody @Validated User user){

        //更新用户基本信息
        userService.update(user);
        return Result.success();
    }

    @PatchMapping("/updatePwd")
    public Result updatePwd(@RequestBody Map<String, String> params) {
        // 从 Sa-Token 会话中获取用户名
        String username = (String) StpUtil.getSession().get("username");
        User loginUser = userService.findByUserName(username);

        //更新用户密码
        //1.校验参数
        String oldPwd = params.get("old_pwd");
        String newPwd = params.get("new_pwd");
        String rePWd = params.get("re_pwd");

        if (!StringUtils.hasLength(oldPwd) || !StringUtils.hasLength(newPwd) || !StringUtils.hasLength(rePWd)) {
            return Result.error("缺少必要的参数");
        }


        if (!loginUser.getPassword().equals(Md5Util.getMD5String(oldPwd)))//如果密码不一样
        {
            return Result.error("原密码填写不正确");
        }

        //newPwd和rePwd是否一样
        if (!rePWd.equals(newPwd)) {
            return Result.error("两次填写的新密码不一致");
        }

        //2.调用service完成密码更新
        userService.updatePwd(newPwd);
        return Result.success();
    }
}
